extends TextureRect

var data: CustomerData
var dialogue_ui: Node 
@onready var main_bar = get_parent()


var waiting_for_evolution: bool = false #用于检测是不是刚喝完满意的酒

#记录已经调查过的区域，防止重复触发
var investigated_zones: Array[String] = []

#加载放大镜图片
var cursor_magnifier = load("res://sprite/UI/Magnifying_112815_0958.png") 

# 用来记录刚才调查发现的、但还没给玩家的线索
var pending_clue: ClueData = null

func _ready():
	if has_node("../DialogueLayer"):
		dialogue_ui = get_node("../DialogueLayer")
		print("顾客脚本：成功找到 DialogueLayer 兄弟节点")
	elif get_parent().has_node("DialogueLayer"):
		dialogue_ui = get_parent().get_node("DialogueLayer")
		print("顾客脚本：在父节点下找到了 DialogueLayer")
	#安全连接信号
	if dialogue_ui:
		#防止重复连接
		if not dialogue_ui.dialogue_finished.is_connected(_on_dialogue_finished):
			dialogue_ui.dialogue_finished.connect(_on_dialogue_finished)
			print("顾客脚本：成功连接信号！")
	else:
		print("❌ 严重错误: customer.gd 找不到兄弟节点 '../DialogueLayer'！")
		print("请检查：1. DialogueLayer 是否改名？ 2. CustomerSpot 和 DialogueLayer 是否在同一层级？")
	#连接热区信号
	var zones = $Hotspots.get_children()
	
	for zone in zones:
		if zone is TextureButton:
			#连接点击
			zone.pressed.connect(_on_zone_clicked.bind(zone.name))
			#连接鼠标悬停 (变身放大镜)
			zone.mouse_entered.connect(_on_zone_hover_enter.bind(zone.name))
			#连接鼠标离开
			zone.mouse_exited.connect(_on_zone_hover_exit)
	
	#换表情切换信号
	if not dialogue_ui.expression_requested.is_connected(_on_expression_requested):
		dialogue_ui.expression_requested.connect(_on_expression_requested)
		
	if Dialogic.current_timeline != null:
		Dialogic.end_timeline()
		
#换表情逻辑
func _on_expression_requested(exp_name: String):
	#检查当前客人的数据里有没有这个表情
	if data.expressions.has(exp_name):
		#换图
		texture = data.expressions[exp_name]
	else:
		print("找不到表情: ", exp_name)
		#也可以选择变回默认表情
		#texture = data.texture 

func set_customer_data(new_data: CustomerData):
	data = new_data
	texture = data.texture
	#每次换新客人，重置调查记录
	investigated_zones.clear()
	
	var all_zones = $Hotspots.get_children()
	
	for zone in all_zones:
		#只处理按钮
		if zone is TextureButton:
			#检查这个按钮的名字，是否在当前数据的“激活名单”里
			if zone.name in data.active_zones:
				zone.show() #在名单里的调查区域就显示
				zone.mouse_filter = Control.MOUSE_FILTER_STOP #确保能点
			else:
				zone.hide() #不在名单里的就隐藏
				zone.mouse_filter = Control.MOUSE_FILTER_IGNORE #确保不会挡鼠标

#调查逻辑
func _on_zone_clicked(zone_name: String):
	#只有在可以交互时才能调查
	if not Global.can_interact: return
	
	print("--------------------")
	print("点击了按钮: ", zone_name)
	#转换名字方便去字典查
	var key = zone_name.replace("Zone", "").to_lower() # "head"
	print("转换出的 Key: ", key)
	#检查是否已经调查过
	if key in investigated_zones:
		print("❌ 失败：这个 Key 已经在已调查列表里了: ", investigated_zones)
		main_bar.show_floating_text("这里已经看过了...", Color.GRAY)
		return
	
	if data.investigation_clues.has(key):
		print("✅ 成功：在字典里找到了线索！")
		#记录已调查
		investigated_zones.append(key)
		
		#播放对话
		var lines = data.investigation_clues[key]
		dialogue_ui.start_dialogue(data.name, lines, data.name_color)
		
		#检查是否有线索，如果有，先存起来，别急着给
		if data.zone_clues.has(key):
			#先存到暂存区
			pending_clue = data.zone_clues[key] 
			print("发现了线索：", pending_clue.name, "，等待对话结束...")
		else:
			pending_clue = null #没线索就清空，防止把上次的给了
			
	else:
		print("❌ 失败：字典里找不到这个 Key。字典里目前只有: ", data.investigation_clues.keys())
		get_tree().current_scene.show_floating_text("没什么特别的。", Color.GRAY)

#鼠标变放大镜
func _on_zone_hover_enter(zone_name):
	if not Global.can_interact: return
	
	var key = zone_name.replace("Zone", "").to_lower()
	
	if key in investigated_zones:
		return
	
	#设置放大镜光标
	Input.set_custom_mouse_cursor(cursor_magnifier, Input.CURSOR_ARROW, Vector2(16, 16))

func _on_zone_hover_exit():
	#恢复默认光标
	Input.set_custom_mouse_cursor(null)

#接收酒杯(带门槛)
func _can_drop_data(at_position, data):
	return data is Dictionary and data.get("type") == "drink"

func _drop_data(at_position, drag_data):
	var drink_node = drag_data["node"]
	
	if data.investigation_complete_scene != "":
		var main = get_tree().current_scene
		main.show_floating_text("我现在应该把注意力放在客人身上。", Color.ORANGE)
		return #直接拒收，后续的逻辑全部跳过
	
	#第一道门槛：完全没调查过
	if investigated_zones.is_empty():
		#获取主场景引用
		var main = get_tree().current_scene
		main.show_floating_text("不要随便上酒，必须先明白顾客需要什么哦！", Color.RED)
		drink_node.cancel_drop()
		return #拒收
	
	#第二道门槛：调查了，但没调查到核心部位
	if not data.key_clue_zone in investigated_zones:
		var main = get_tree().current_scene
		main.show_floating_text("我们应该再问问客人。", Color.ORANGE)
		drink_node.cancel_drop()
		return #拒收
		
	#通过门槛：开始上酒
	#销毁手里的酒
	var recipe = drag_data["recipe"]
	drink_node.queue_free()
	
	#评价逻辑
	if recipe.name == data.wanted_drink_id:
		dialogue_ui.start_dialogue(data.name, data.dialog_success, data.name_color)
		if data.next_phase or data.next_scene_path != "":
			waiting_for_evolution = true
	else:
		dialogue_ui.start_dialogue(data.name, data.dialog_fail, data.name_color)
		waiting_for_evolution = false

func _on_dialogue_finished():
	print("顾客脚本：收到对话结束信号！开始等待调酒...")
	
	if pending_clue:
		print(">>> [2] 发现待领取线索：", pending_clue.name)
		
		# 获取主场景
		var main = get_tree().current_scene
		
		# 尝试添加
		main.add_clue(pending_clue)
		print(">>> [3] 已请求 MainBar 添加图标")
		
		pending_clue = null
	else:
		print(">>> [?] 没有待领取的线索 (pending_clue 是空的)")
		
	if pending_clue:
		# 获取主场景并添加线索
		get_tree().current_scene.add_clue(pending_clue)
		# 清空暂存
		pending_clue = null
	
	if waiting_for_evolution:
		#如果配置了跳转场景，直接换场景
		if data.next_scene_path != "":
			get_tree().change_scene_to_file(data.next_scene_path)
			return
		#如果有下一阶段，进行变身
		if data.next_phase:
			set_customer_data(data.next_phase)
			get_tree().current_scene.show_floating_text("客人的状态改变了！", Color.GOLD)
			dialogue_ui.start_dialogue(data.name, data.dialog_start)
		#重置标记
		waiting_for_evolution = false
		return
	
	
	print(">>> DEBUG: 状态已更新，现在允许调酒 (waiting_for_evolution = true)")
	#调查点跳转
	if data.investigation_complete_scene != "":
		if _check_all_zones_investigated():
			print("所有线索收集完毕，跳转剧情！")
			get_tree().change_scene_to_file(data.investigation_complete_scene)
			
func _check_all_zones_investigated() -> bool:
	#遍历当前数据要求的每一个热区名字
	for zone_name in data.active_zones:
		#把节点名转换成key
		var key = zone_name.replace("Zone", "").to_lower()
		
		#如果这个key不在已调查列表里，说明还没查完
		if not key in investigated_zones:
			return false
			
	#循环走完了都没返回false，说明全查完了
	return true
